#pragma once
#include <iostream>
#include "Common.hpp"
#include <stdio.h>
#include <string.h>
#include <errno.h>

class Init
{
public:
    Init()
    {
        //创建命名管道
        umask(0);
        int n = ::mkfifo(gpipefile.c_str(), gmode);
        if (n < 0)
        {
            std::cerr << "mkfifo error: " << strerror(errno) <<std::endl;
            return;
        }

        std::cout << "mkfifo success" << std::endl;
    }

    ~Init()
    {
        int n = ::unlink(gpipefile.c_str());
        if (n < 0)
        {
            std::cerr << "unlink error" << std::endl;
            return;
        }

        std::cout << "unlink success" << std::endl;
    }
};

Init init;

class Server
{
public:
    Server()
        :_fd(gdefaultfd)
    {}

    bool OpenPipeForRead()
    {
        _fd = OpenPipe(gForRead);
        if (_fd < 0)
            return false;
        return true;
    }

    // std::string *:输出型参数
    // const std::string &: 输入型参数
    // std::string &:输入输出型参数
    int RecvPipe(std::string *out)
    {
        char buffer[gsize];
        ssize_t n = ::read(_fd, buffer, sizeof(buffer) - 1);
        if (n > 0)
        {
            buffer[n] = 0;
            *out = buffer;
        }
        return n;
    }

    void ClosePipe()
    {
        ClosePipeHelper(_fd);
    }

    ~Server()
    {}

private:
    int _fd;
};